#compilateur à utiliser pour compiler le projet
CC = gcc
# les arguments à passer au compilateur
# -Wall : activer tous les warning
# -lm : ajouter la librairie mathematique au compilateur
CFLAGS = -Wall -lm  -O0 -g3
# le repertoire contenant les fichiers source (.c)
SRC_DIR = src
# le répertoire contenant les fichiers Header (.h)
H_DIR = header
# le repertoire où seront generés les fichiers .o
OBJ_DIR = obj
# le répertoire où sera generé le fichier executable
BIN_DIR = bin

#le nom du fichier executable à créer
EXEC_NAME = ${BIN_DIR}/kmeans

#construire la liste des fichiers sources contenus dans le répertoire source (src/fichier.c).
SRC_FILES = $(wildcard ${SRC_DIR}/*.c)
#construire la liste des fichiers .o (sans le nom du répertoire fichier.o) à partir de de la liste des fichiers source qui vient d'être construite
# en remplaçant l'extension .c par .o.
OBJS = $(notdir $(SRC_FILES:.c=.o))
#ajouter aux noms des fichiers objets qui viennent d'être construits le nom du répertoire qui contientra le fichier.o
OBJ_FILES := $(addprefix $(OBJ_DIR)/, $(OBJS))

#cible all qui consuira le fichier executable.
all : $(EXEC_NAME)
#cible de nettoyage des repertoire des fichiers .o et du fichier executable.
# -f pour ignorer les fichiers inexistant
clean :
	rm -f ${BIN_DIR}/* ${OBJ_DIR}/*

# le fichier execurable est construit à partir de tous les fichiers .o
$(EXEC_NAME) : $(OBJ_FILES) 
	
	$(CC) -o $(EXEC_NAME) $(OBJ_FILES) $(CFLAGS) 
#une sorte de boucle qui construit chaque fichier .o à partir du fichier .c correspendant et les fichiers .h
# "$@" :alias de la cible
# "$<" alias des composants de la cible en l'occurance le .c ici.
# -iquote pour indiquer les fichiers .h à inclure
$(OBJ_DIR)/%.o : $(SRC_DIR)/%.c
	$(CC) -iquote $(H_DIR)  -o $@ -c $< $(CFLAGS) 
